/* eslint-disable no-undef */
// spawn
import { execSync } from 'child_process'
import fs from 'fs'
import { dirname, join } from 'path'
import { fileURLToPath } from 'url'

const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(dirname(dirname(__filename)))

const getArgs = (args, defaultEnv = 'dev') => {
  let env = defaultEnv // 第一个参数指 运行什么环境
  let version = null // 第二个参数是指 指定版本号
  let isApp = false // 是否是 app 包
  args.forEach((arg) => {
    if (arg === 'app') isApp = true
    else if (!Number.isNaN(+arg)) version = arg
    else env = arg
  })
  return [env, version, isApp]
}

const getCommand = (type, env, project) => {
  let command = ``
  if (project === 'scm:pc') {
    switch (env) {
      case 'development':
      case 'dev': {
        console.log('运行环境：' + '开发环境\n')
        if (type === 'dev') command = 'npm run dev:development --workspace @holike/fe-scm-pc'
        else if (type === 'build')
          command = 'npm run build:development --workspace @holike/fe-scm-pc'
        break
      }
      case 'test': {
        console.log('运行环境：' + '测试环境\n')
        if (type === 'dev') command = 'npm run dev:test --workspace @holike/fe-scm-pc'
        else if (type === 'build') command = 'npm run build:test --workspace @holike/fe-scm-pc'
        break
      }
      case 'production':
      case 'prod': {
        console.log('运行环境：' + '正式环境(请注意数据保护)\n')
        if (type === 'dev') command = 'npm run dev:production --workspace @holike/fe-scm-pc'
        else if (type === 'build')
          command = 'npm run build:production --workspace @holike/fe-scm-pc'
        break
      }
      default: {
        throw new Error('非法的运行环境')
      }
    }
  }
  return command
}

const updateFile = (env, project, version, cb) => {
  // 修改版本号

  let envFilePath

  if (project === 'scm:pc') {
    if (env === 'prod' || env === 'production') {
      envFilePath = join(__dirname, '/packages/scm-pc/.env.production') // 修改prod文件的版本
    } else if (env === 'test')
      envFilePath = join(__dirname, '/packages/scm-pc/.env.test') // 修改test文件的版本
    else envFilePath = join(__dirname, '/packages/scm-pc/.env.development') // 修改dev文件的版本
  }

  fs.readFile(envFilePath, 'utf8', (err, data) => {
    if (err) {
      console.error('Error reading file:', err)
      return
    }

    let dataList = data.split('\n')
    dataList[0] = `VITE_VERSION = '${version}'`

    fs.writeFile(envFilePath, dataList.join('\n'), 'utf8', (err) => {
      if (err) {
        console.error('Error writing to .env file:', err)
        return
      }
      console.log(`版本已更改，当前版本：${version}`)
      setTimeout(() => {
        cb()
      }, 1000)
    })
  })
}

const runCommand = (command) => {
  console.log(`
        H   H   OOO   L      III   K   K   EEEEE
        H   H  O   O  L       I    K  K    E
        HHHHH  O   O  L       I    KKK     EEE
        H   H  O   O  L       I    K  K    E
        H   H   OOO   LLLLL  III   K   K   EEEEE
      `)
  execSync(command, {
    stdio: 'inherit'
  }) // 执行 Vite 开发命令
}


// uniapp 构建过程会阻塞进程，需要使用流式执行，监听他的输出结果
// const runSpawnCommand = (command, env, version, type) => {
//   if (version) {
//     fs.readFile(join(__dirname, '/packages/wms-pda/src/manifest.json'), 'utf8', (err, data) => {
//       if (err) {
//         console.error('Error reading file:', err)
//         return
//       }
//       let tempData = data.split('\n')
//       tempData[4] = `    "versionName" : "${version.toString().split('').join('.')}",`
//       tempData[5] = `    "versionCode" : "${version}",`

//       fs.writeFile(
//         join(__dirname, '/packages/wms-pda/src/manifest.json'),
//         tempData.join('\n'),
//         'utf8',
//         (err) => {
//           if (err) {
//             console.error('Error writing to manifest file:', err)
//             return
//           }
//         }
//       )
//     }) // 改源文件版本号

//     fs.readFile(join(__dirname, '/wms-pda-native/build-helper/build.gradle'), 'utf8', (err, data) => {
//       if (err) {
//         console.error('Error reading file:', err)
//         return
//       }
//       let fileData = data.split('\n')
//       if (env === 'prod' || env === 'production') {
//         fileData[59] = `            versionCode ${version}`
//         fileData[60] = `            versionName "${version.toString().split('').join('.')}"`
//       } else {
//         fileData[68] = `            versionCode ${version}`
//         fileData[69] = `            versionName "${version.toString().split('').join('.')}"`
//       }
//       fs.writeFile(
//         join(__dirname, '/wms-pda-native/build-helper/build.gradle'),
//         fileData.join('\n'),
//         'utf8',
//         (err) => {
//           if (err) {
//             console.error('Error writing to gradle file:', err)
//             return
//           }
//         }
//       )
//     }) // 改打包文件版本号
//   }
//   let commandList = command.split(' ')
//   const buildProcess = spawn(...commandList.splice(0, 1), commandList, { shell: true })
//   // 监听命令的输出
//   buildProcess.stdout.on('data', (streamData) => {
//     if (streamData.toString().indexOf('HBuilderX') !== -1) {
//       let appid = env === 'prod' || env === 'production' ? '__UNI__2192730' : '__UNI__2192730'
//       let name = env === 'prod' || env === 'production' ? ' WMS' : ' WMS(TEST)'
//       let envFilePath
//       if (type === 'build') {
//         envFilePath = join(__dirname, '/packages/wms-pda/dist/build/app/manifest.json')
//       } else {
//         envFilePath = join(__dirname, '/packages/wms-pda/dist/dev/app/manifest.json')
//       }
//       fs.readFile(envFilePath, 'utf8', (err, data) => {
//         if (err) {
//           console.error('Error reading file:', err)
//           return
//         }
//         let tempData = data.split('\n')
//         tempData[6] = `  "id" : "${appid}",`
//         tempData[7] = `  "name" : "${name}",`
//         if (version) {
//           tempData[9] = `    "name" : "${version.toString().split('').join('.')}",`
//           tempData[10] = `    "code" : "${version}"`
//         }
//         fs.writeFile(envFilePath, tempData.join('\n'), 'utf8', (err) => {
//           if (err) {
//             console.error('Error writing to manifest file:', err)
//             return
//           }
//           console.log(`
//                         H   H   OOO   L      III   K   K   EEEEE
//                         H   H  O   O  L       I    K  K    E
//                         HHHHH  O   O  L       I    KKK     EEE
//                         H   H  O   O  L       I    K  K    E
//                         H   H   OOO   LLLLL  III   K   K   EEEEE
//                       `)
//           console.log(`uniapp 构建结束`)
//           console.log(`env: ` + env)
//           console.log(`version: ${version ? version : '默认'}`)
//           console.log(streamData.toString())
//         })
//       })

//     } else {
//       console.log(streamData.toString())
//     }
//   })
// }

const runTool = (type, project, args) => {

  let defaultEnv = type === 'build' ? 'prod' : 'dev'
  let [env, version, isApp] = getArgs(args, defaultEnv)
  let command = getCommand(type, env, project, isApp)
  if (version) {
    updateFile(env, project, version, runCommand.bind(this, command))
  } else {
    runCommand(command)
  }
}

export default runTool
